package com.example.manager;

import com.example.utils.MqttUtil;
import lombok.extern.slf4j.Slf4j;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

/**
 * 水位计管理器
 *
 * @author: Fred
 * @email 453086@qq.com
 * @create: 2024-09-29 14:23
 */
@Slf4j
public class WaterManager {

    private static final WaterManager instance = new WaterManager();
    private Float waterValue = null;


    private WaterManager() {
        // 私有构造函数，确保单例模式
    }

    public static WaterManager getInstance() {
        return instance;
    }

    public void processPackets(StringBuilder dataCache) {
        String packetHeader = "010304";
        int packetLength = 18;

        while (dataCache.length() >= packetLength) {
            // 找到帧头
            int startIndex = dataCache.indexOf(packetHeader);
            if (startIndex == -1) {
                // 如果没有找到帧头，清除无效数据并退出
                dataCache.setLength(0);
                break;
            }

            // 如果帧头之后不足一个完整数据包，等待更多数据
            if (dataCache.length() - startIndex < packetLength) {
                break;
            }

            // 提取一个完整的数据包
            String fullPacket = dataCache.substring(startIndex, startIndex + packetLength);

            try {
                // 解析数据包
                String hex = fullPacket.substring(6, 14);

                byte[] bytes = hexStringToByteArray(hex);

                // 使用 ByteBuffer 读取字节数组并将其解析为 float（单精度浮动数）
                float value = ByteBuffer.wrap(bytes).getFloat();
                // 如果存在上一次值并且水位差大于 0.5，跳过处理
                if (waterValue != null && Math.abs(value - waterValue) > 0.5) {
                    dataCache.delete(0, startIndex + packetLength);
                    continue;
                }
                // 更新水位值
                log.info("水位计数据: {}", value);
                waterValue = value;
                MqttUtil.mqttTemplate.publishAsync("/water/value", String.valueOf(value).getBytes(StandardCharsets.UTF_8));
            } catch (Exception e) {
                log.error("解析数据包失败: {}", fullPacket, e);
            } finally {
                // 移除已处理部分
                dataCache.delete(0, startIndex + packetLength);
            }
        }
    }

    public byte[] hexStringToByteArray(String hex) {
        int len = hex.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i + 1), 16));
        }
        return data;
    }
}